<?php
namespace app\model;

class Note extends BaseModel
{
    protected $name = 'notes';

    // 自动时间戳
    protected $autoWriteTimestamp = true;

    // 类型转换
    protected $type = [
        'created_at' => 'integer',
        'updated_at' => 'integer',
        'delete_time' => 'integer',
        'images' => 'json',
        'files' => 'json',
        'is_summarized' => 'boolean'
    ];

    // 来源常量
    const SOURCE_USER = 1;
    const SOURCE_AI = 2;
    const SOURCE_WEB = 3;

    // 重要程度常量
    const IMPORTANCE_NORMAL = 1;
    const IMPORTANCE_IMPORTANT = 2;
    const IMPORTANCE_CRITICAL = 3;

    /**
     * 关联用户
     */
    public function user()
    {
        return $this->belongsTo(User::class);
    }

    /**
     * 关联提醒
     */
    public function reminder()
    {
        return $this->belongsTo(Reminder::class, 'reminder_id');
    }

    /**
     * 获取关键词数组
     */
    public function getKeywordsArray()
    {
        return $this->keywords ? explode(',', $this->keywords) : [];
    }

    /**
     * 设置关键词
     */
    public function setKeywords(array $keywords)
    {
        $this->keywords = implode(',', array_unique(array_filter($keywords)));
    }

    /**
     * 格式化来源URL
     * @param string $url
     * @return string
     */
    public static function formatSourceUrl($url)
    {
        if (empty($url)) {
            return '';
        }

        // 移除多余的空白字符
        $url = trim($url);

        // 如果URL不包含协议，添加https://
        if (!preg_match("~^(?:f|ht)tps?://~i", $url)) {
            $url = 'https://' . $url;
        }

        // 验证URL格式
        if (!filter_var($url, FILTER_VALIDATE_URL)) {
            throw new \Exception('无效的URL格式');
        }

        return $url;
    }

    /**
     * source_url 字段的修改器
     * @param string $value
     * @return string
     */
    public function setSourceUrlAttr($value)
    {
        return self::formatSourceUrl($value);
    }

    /**
     * 设置标题的修改器
     * @param string|null $value
     * @return string
     */
    public function setTitleAttr($value)
    {
        // 如果标题为空且内容不为空，则使用内容的前20个字符作为标题
        if (empty($value) && !empty($this->content)) {
            return mb_substr($this->content, 0, 20) . '...';
        }
        return $value;
    }

    /**
     * AI历史记录获取器
     * @param mixed $value
     * @return array
     */
    public function getAiHistoryAttribute($value)
    {
        if (empty($value)) {
            return [];
        }
        return json_decode($value, true) ?: [];
    }

    /**
     * AI历史记录修改器
     * @param mixed $value
     * @return string|null
     */
    public function setAiHistoryAttr($value)
    {
        if (empty($value)) {
            return null;
        }
        return json_encode($value);
    }

    /**
     * 获取AI历史记录数组
     * @return array
     */
    public function getAiHistoryArray()
    {
        return $this->getAttr('ai_history') ?: [];
    }

    /**
     * 记录AI操作历史
     * @param string $action 操作类型
     * @param string $description 操作描述
     * @return bool
     */
    public function recordAiHistory($action, $description)
    {
        $history = $this->getAiHistoryArray();
        
        $history[] = [
            'action' => $action,
            'description' => $description,
            'time' => time()
        ];

        $this->ai_history = $history;
        return $this->save();
    }

    /**
     * 清除AI历史记录
     * @return bool
     */
    public function clearAiHistory()
    {
        $this->ai_history = null;
        return $this->save();
    }

    /**
     * 获取最后一条AI历史记录
     * @return array|null
     */
    public function getLastAiHistory()
    {
        $history = $this->getAiHistoryArray();
        return !empty($history) ? end($history) : null;
    }

} 